﻿Imports System.Reflection

Public Class ExportToExcel
    Public Sub Export(ByVal dt As DataTable, ByVal sheetName As String, ByVal title As String)
        'Tạo các đối tượng Excel
        Dim oExcel As New Microsoft.Office.Interop.Excel.Application()
        Dim oBooks As Microsoft.Office.Interop.Excel.Workbooks
        Dim oSheets As Microsoft.Office.Interop.Excel.Sheets
        Dim oBook As Microsoft.Office.Interop.Excel.Workbook
        Dim oSheet As Microsoft.Office.Interop.Excel.Worksheet

        'Tạo mới một Excel WorkBook
        oExcel.Visible = True
        oExcel.DisplayAlerts = False
        oExcel.Application.SheetsInNewWorkbook = 1
        oBooks = oExcel.Workbooks
        oBook = DirectCast(oExcel.Workbooks.Add(Type.Missing), Microsoft.Office.Interop.Excel.Workbook)
        oSheets = oBook.Worksheets
        oSheet = DirectCast(oSheets.Item(1), Microsoft.Office.Interop.Excel.Worksheet)
        oSheet.Name = sheetName

        'Tạo phần đầu 
        Dim head As Microsoft.Office.Interop.Excel.Range = oSheet.Range("A1", "K1")
        head.MergeCells = True
        head.Value2 = title
        head.Font.Bold = True
        head.Font.Name = "Tahoma"
        head.Font.Size = "18"
        head.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter
        ' Tạo tiêu đề cột
        Dim cl1 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("A3", "A3")
        cl1.Value2 = "Mã chậu"
        cl1.ColumnWidth = 11.0
        Dim cl2 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("B3", "B3")
        cl2.Value2 = "Tên chậu"
        cl2.ColumnWidth = 20.0
        Dim cl3 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("C3", "C3")
        cl3.Value2 = "Mã loại"
        cl3.ColumnWidth = 11.5
        Dim cl4 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("D3", "D3")
        cl4.Value2 = "Trị giá"
        cl4.ColumnWidth = 11.0
        Dim cl5 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("E3", "E3")
        cl5.Value2 = "Kích thước"
        cl5.ColumnWidth = 11.0
        Dim cl6 As Microsoft.Office.Interop.Excel.Range = oSheet.Range("F3", "F3")
        cl6.Value2 = "Số lượng"
        cl6.ColumnWidth = 11.0

       Dim arr As Object(,) = New Object(dt.Rows.Count - 1, dt.Columns.Count - 1) {}

        'Chuyển dữ liệu từ DataTable vào mảng đối tượng
        For r As Integer = 0 To dt.Rows.Count - 1
            Dim dr As DataRow = dt.Rows(r)
            For c As Integer = 0 To dt.Columns.Count - 1
                arr(r, c) = dr(c)
            Next
        Next
        'Thiết lập vùng điền dữ liệu
        Dim rowStart As Integer = 4
        Dim columnStart As Integer = 1
        Dim rowEnd As Integer = rowStart + dt.Rows.Count - 1
        Dim columnEnd As Integer = dt.Columns.Count
        ' Ô bắt đầu điền dữ liệu
        Dim g1 As Microsoft.Office.Interop.Excel.Range = DirectCast(oSheet.Cells(rowStart, columnStart), Microsoft.Office.Interop.Excel.Range)
        ' Ô kết thúc điền dữ liệu
        Dim g2 As Microsoft.Office.Interop.Excel.Range = DirectCast(oSheet.Cells(rowEnd, columnEnd), Microsoft.Office.Interop.Excel.Range)
        ' Lấy về vùng điền dữ liệu
        Dim range As Microsoft.Office.Interop.Excel.Range = oSheet.Range(g1, g2)

        'Điền dữ liệu vào vùng đã thiết lập
        range.Value2 = arr

        'Lưu dữ liệu 
        Using exportSaveFileDialog As New SaveFileDialog()
            exportSaveFileDialog.Title = "Select Excel File"
            exportSaveFileDialog.Filter = "Microsoft Office Excel Workbook(*.xlsx)|*.xlsx"
            If DialogResult.OK = exportSaveFileDialog.ShowDialog() Then
                Dim fullFileName As String = exportSaveFileDialog.FileName
                oBook.SaveAs(fullFileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, System.Reflection.Missing.Value, Missing.Value, False, False, _
                Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, True, Missing.Value, Missing.Value, Missing.Value)
                oBook.Saved = True
                MessageBox.Show("Export thành công!!!", "Exported to Excel", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Using
    End Sub
End Class
